package com.jyxd.web.dao.patient;

import com.jyxd.web.data.hisview.HisYb;
import com.jyxd.web.data.patient.Patient;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

@Repository
public interface PatientDao {

    /**
     * 新增一条病人表记录
     *
     * @param patient
     * @return boolean
     */
    boolean insert(Patient patient);

    /**
     * 根据主键id查询一条病人表记录
     *
     * @param id
     * @return Patient
     */
    Patient queryData(String id);

    /**
     * 查询时间段内患者总数(质控vap统计分母使用)
     *
     * @param map
     * @return
     */
    List<Patient> queryPatientAll(Map<String, Object> map);

    /**
     * 更新一条病人表记录
     *
     * @param patient
     * @return boolean
     */
    boolean update(Patient patient);

    /**
     * 根据条件分页查询病人表记录列表
     *
     * @param map
     * @return list
     */
    List<Patient> queryList(Map<String, Object> map);

    /**
     * 根据条件分页查询病人表记录列表
     *
     * @param map
     * @return list
     */
    List<Patient> queryOtherList(Map<String, Object> map);

    /**
     * 根据条件查询列表总记录数
     *
     * @param map
     * @return
     */
    int queryOtherNum(Map<String, Object> map);

    /**
     * 根据条件查询列表总记录数
     *
     * @param map
     * @return
     */
    int queryNum(Map<String, Object> map);

    /**
     * 查询时间段内重症收治患者数
     *
     * @param map
     * @return
     */
    int getNumByStartAndEndMolecule(Map<String, Object> map);

    /**
     * 查询时间段内全院收治患者数
     *
     * @param map
     * @return
     */
    int getNumByStartAndEndDenominator(Map<String, Object> map);

    /**
     * 查询时间段内重症收治患者床日数
     *
     * @param map
     * @return
     */
    int getNumByRateOfBedMolecule(Map<String, Object> map);

    /**
     * 查询时间段内全院收治患者床日数
     *
     * @param map
     * @return
     */
    int getNumByRateOfBedDenominator(Map<String, Object> map);


    /**
     * 根据条件分页查询病人表记录列表--多表查询
     *
     * @param map
     * @return list
     */
    List<Map<String, Object>> getList(Map<String, Object> map);

    /**
     * 根据条件查询列表总记录数--多表查询
     *
     * @param map
     * @return
     */
    int getNum(Map<String, Object> map);

    /**
     * 查询所有病人数量
     *
     * @return
     */
    int getAllNum();

    /**
     * 根据条件查询需要下载的病人信息列表
     *
     * @param map
     * @return list
     */
    List<LinkedHashMap<String, Object>> getDownloadList(Map<String, Object> map);

    /**
     * 首页查询患者现有数量 今日转入数量 今日转出数量
     *
     * @param map
     * @return
     */
    int getNowPatientNum(Map<String, Object> map);

    /**
     * 首页查询床位列表
     *
     * @return
     */
    List<Map<String, Object>> getBedPatientList(Map<String,Object> map);

    /**
     * 查询待分配的病人列表（是否分配床位）
     *
     * @param map
     * @return
     */
    List<Patient> getNoBedPatientList(Map<String, Object> map);
    List<Map<String, Long>> statisticsPatientSource(Map<String, Object> map);

    /**
     * 查询已出科的病人列表
     *
     * @param map
     * @return
     */
    List<Patient> getOutPatientList(Map<String, Object> map);

    /**
     * 统计分析--出入科--转入转出分析
     *
     * @param map
     * @return
     */
    int getOutAndIn(Map<String, Object> map);

    /**
     * 查询所有病人的入科科室分类名称
     *
     * @return
     */
    List<Map<String, Object>> getAllEnterDepartment(Map<String, Object> map);

    /**
     * 统计分析--出入科--转入或转出科室病人数量
     *
     * @param map
     * @return
     */
    int getEnterAndExitDepartment(Map<String, Object> map);

    /**
     * 查询所有病人的出科科室分类名称
     *
     * @return
     */
    List<Map<String, Object>> getAllExitDepartment(Map<String, Object> map);

    /**
     * 统计分析--出入科--趋势分析--转出方式(按天)
     *
     * @return
     */
    List<Map<String, Object>> getNumByExitType(Map<String, Object> map);

    /**
     * 统计分析--出入科--趋势分析--转出方式（按月）
     *
     * @return
     */
    List<Map<String, Object>> getNumByExitTypeMonth(Map<String, Object> map);

    /**
     * 查询所有病人信息 stats!=-1
     *
     * @return
     */
    List<Patient> queryPatientList(Map<String, Object> map);

    /**
     * 根据条件查询病人对象
     *
     * @param map
     * @return
     */
    Patient getPatientByConditions(Map<String, Object> map);

    /**
     * 病人管理--首页--查询病人监护仪及采集频率
     *
     * @param map
     * @return
     */
    Map<String, Object> queryPatientMonitor(Map<String, Object> map);

    /**
     * 根据患者主索引号查询最近的一条病人记录
     *
     * @param visitId
     * @return
     */
    Patient getPatientByVisitId(String visitId);

    /**
     * 根据患者主索引号查询最近的一条病人记录
     *
     * @param visitId
     * @return
     */
    Patient getPatientByVisitIdAndFlagAndStatus(@Param("visitId") String visitId, @Param("flag") String flag, @Param("status") String status);

    /**
     * 根据患者病例号查询最近的一条病人记录
     *
     * @param documentNo
     * @return
     */
    Patient getPatientByDocumentNoAndFlagAndStatus(@Param("documentNo") String documentNo, @Param("flag") String flag, @Param("status") String status);

    /**
     * 统计现有患者的信息
     *
     * @param dataTime
     * @return
     */
    int getExitPatientNum(@Param("dataTime") String dataTime, @Param("type") String type);

    /**
     * 统计现有患者的信息(多科室)
     *
     * @param dataTime
     * @return
     */
    int getExitPatientNumMultiDept(@Param("dataTime") String dataTime, @Param("type") String type, @Param("status") int status);

    /**
     * 查询计划患者
     *
     * @param map
     * @return
     */
    int getPlanPatientNum(Map<String, Object> map);

    /**
     * 统计转出患者的信息
     *
     * @param dataTime
     * @return
     */
    int getRollOutPatientNum(@Param("dataTime") String dataTime, @Param("type") String type, @Param("startTime") String startTime);

    /**
     * 统计转出患者的信息【多科室】
     *
     * @param dataTime
     * @return
     */
    int getRollOutPatientNumMultiDept(@Param("dataTime") String dataTime, @Param("type") String type, @Param("startTime") String startTime, @Param("status") int status);

    /**
     * 统计转入患者的信息
     *
     * @param dataTime
     * @return
     */
    int getTransferPatientNum(@Param("dataTime") String dataTime, @Param("type") String type);

    /**
     * 统计转入患者的信息【多科室】
     *
     * @param dataTime
     * @return
     */
    int getTransferPatientNumMultiDept(@Param("dataTime") String dataTime, @Param("type") String type, @Param("status") int status);

    /**
     * 查询转入患者list
     *
     * @param dataTime
     * @param type
     * @return
     */
    List<Patient> getRollOutPatientList(@Param("dataTime") String dataTime, @Param("type") String type, @Param("startTime") String startTime);

    /**
     * 根据住院号和在科标识查询患者
     *
     * @param visitId
     * @param flag
     * @return
     */
    List<Patient> queryPatientByVisitIdAndFlag(@Param("visitId") String visitId, @Param("flag") String flag);

    /**
     * 查询所有在床且在科的病人
     *
     * @return
     */
    List<Patient> queryPatientByFlagAndBed(String status);

    /**
     * 查询空床位列表
     *
     * @return
     */
    List<Map<String, Object>> getBedNullPatientList(Map<String,Object> map);

    /**
     * 查询所有在床且在科的病人
     *
     * @return
     */
    List<Patient> queryOldPatientByVisitTime(Map<String,Object> map);

    /**
     * 查询医保对接数据
     * @return
     */
    List<HisYb> queryYBDataAll();

    /**
     * 查询所有病人信息 stats=1
     *
     * @return
     */
    List<Patient> getPatientAllList();

    Map<String, Object> getOutAndInTotal(Map<String, Object> map);

    int updateExitBed(Map<String, Object> param);

    int updateFlag(Map<String, Object> param);
}
